
;+----------------------------------------------------------------------+
;| BZ8DCLK	Read time and date from real-time-clock, convert to	|
;|		Z80dos format and exit with HL pointing to buffer.	|
;|									|
;|		For MicroBee's with Z80DOS and BIOS V9 or PJB's BIOS.	|
;|									|
;|		BZ8DCLK.Z80 adapted from Peter De Lacey's BIOSCLK.Z80.	|
;|		BIOSCLK.Z80 adapted from Ron Murray's BEECLK.Z80.	|
;|		BEECLK.Z80 adapted from S. Kluger's UNDATE.ASM.		|
;|									|
;|		BZ8DCLK.Z80 written by Phil Summers c/o Z-node 62 Perth |
;+----------------------------------------------------------------------+

bz8dclk	push	de		; save all		1
	push	bc		; registers		1
	push	af		; used			1

	ld	hl,tb		;			3
	push	hl		; read time		1
	ld	e,0		; and date from		2
	ld	b,7		; RTC using		2
	ld	a,26		; extended		2
	rst	28h		; BIOS call		1
	pop	hl		;			1

	ld	b,3		;			2
lp	ld	a,(hl)		;			1

	ld	e,a		;			1
	and	0FH		;			2
	ld	d,a		;			1
	ld	a,e		; convert BCD		1
	and	0F0H		; year, month		2
	rrca			; and date in		1
	ld	e,a		; A to binary		1
	rrca			;			1
	rrca			;			1
	add	a,e		;			1
	add	a,d		;			1

	ld	(hl),a		; save binary		1
	inc	hl		; value and point	1
	djnz	lp		; to next		2

	ld	l,a		; count days in HL	1
	ld	h,b		; start with the date	1	b=0

	ld	de,365		; days in a year, start	3
	ld	bc,78+(3*256)	; year, leap year mask	3

ay	ld	a,(year)	; exit if the year	3
	cp	c		; counter has reached	1
	jr	z,fin		; the current year	2

	inc	c		; add 365 days		1
	add	hl,de		; for each year		1

	ld	a,c		; also, if		1
	and	b		; the year is		1
	jr	nz,ay		; a leap year		2
	inc	hl		; then add an		1
	jr	ay		; extra day		2

fin	and	b		; if this year is	1
	ld	a,(month)	; a leap year but	3
	jr	nz,nly		; if the month isn't	2
	cp	b		; past February		1	b=3
	jr	nc,nly		; then subtract the	2
	dec	hl		; incorrect leap year	1

nly	push	hl		; save days so far	1

	ld	e,a		; calculate the		1
	dec	d		; address of the	1	d=0
	ld	hl,dt-1		; number of days	3
	add	hl,de		; so far this		1
	ld	c,(hl)		; year and get		1
	ld	b,d		; it in BC		1

	add	a,246		; adjust fo Oct.,	2
	rl	b		; Nov. and Dec.		2

	pop	hl		; add year-days		1
	add	hl,bc		; to month-days		1
	ld	(nd),hl		; and save in buffer	3

	pop	af		; restore all		1
	pop	bc		; registers		1
	pop	de		; used			1

	ld	hl,nd		; exit with HL		3
	ret			; pointing to buffer	1

dt	db	0		; 1st Jan - 1st Jan	1
	db	31		; 1st Jan - 1st Feb	1
	db	59		; 1st Jan - 1st Mar	1
	db	90		; 1st Jan - 1st Apr	1
	db	120		; 1st Jan - 1st May	1
	db	151		; 1st Jan - 1st Jun	1
	db	181		; 1st Jan - 1st Jul	1
	db	212		; 1st Jan - 1st Aug	1
	db	243		; 1st Jan - 1st Sep	1
	db	273-256		; 1st Jan - 1st Oct	1
	db	304-256		; 1st Jan - 1st Nov	1
	db	334-256		; 1st Jan - 1st Dec	1

tb	equ	$

year	ds	1		; year			1
month	ds	1		; month			1
nd	ds	1		; date			1
	ds	1		; day			1
	ds	1		; hours			1
	ds	1		; minutes		1
	ds	1		; seconds		1

	end
